//权限文件
//引入路由
import store from '@/store'
//引入仓库
import router from '@/router'
//引入进度条
import NProgress from 'nprogress'
NProgress.configure({ showSpinner: false }) //NProgress Configuration
import 'nprogress/nprogress.css'

//跳转白名单
let whiteList = ['/login', '/404', ]

//路由前置守卫
router.beforeEach(async(to, from, next) => {
    /*next()--放行    next(...to)/next('传参数')--一直跳转下去*/
    //开启进度条
    NProgress.start()

    // next()
    //获取token
    const token = store.getters.token

    //判断是否携带token
    if (!!token) {
        //有token--去不去登录页
        if (to.path === '/login') {
            //去--放行
            next('/')
            NProgress.done()
        } else {
            //不去登录页--就看有没有用户信息
            const isGetUserInfo = store.getters.isGetUserInfo
            if (isGetUserInfo) {
                //如果有用户信息--直接放行
                next()
            } else {
                //如果没有用户信息--尝试获取用户信息
                try {
                    //1.获取用户信息
                    await store.dispatch('user/A_getUserInfo')

                    //拿到角色
                    const role = store.state.user.role

                    //2.得到抛出来的动态路由   //获取可以被循环添加的动态路由
                    let accessRoutes = await store.dispatch(
                        'permission/generateRoutes',
                        role
                    )

                    //3.循环添加路由
                    accessRoutes.forEach(route => {
                        router.addRoute(route)
                    })

                    //4.设置用户状态为true
                    store.commit('permission/SET_USERINFO_STATE', true)
                        //5.无线向下跳转，确保路由添加成功
                        //hack方法   无限向下跳转   保证路由添加成功
                        //replace true  路由历史栈里面不会保存路由   为了防止后退
                    next({...to, preplace: true })
                } catch (error) {
                    //等待清空用户信息
                    await store.dispatch('user/A_clear')
                    next(`/login?redirect=${to.path}`)
                }
            }
        }
    } else {
        //不携带token---去不去白名单
        if (whiteList.includes(to.path)) {
            //去--放行
            next()
        } else {
            //不去白名单--就跳转到登录，携带去的地址
            next(`/login?redirect=${to.path}`)
            NProgress.done()
        }
    }
})

//路由后置守卫
router.afterEach(() => {
    //关闭进度条
    NProgress.done()
})